package biz.ws.ws;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import lombok.Getter;
import lombok.Setter;
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;
import org.springframework.data.mongodb.core.mapping.MongoId;

import java.time.LocalDateTime;
import java.util.HashMap;
import java.util.Map;

/**
 * @创建人 xiaojiancheng
 * @时间 2020/1/7
 * @描述 消息模型
 */
@Setter
@Getter
@Document("ws_message")
public class Message {
    /**
     *  {@link #id}         主键
     *  {@link #fromId}     发起者
     *  {@link #toId}       接受者
     *  {@link #createTime} 创建时间
     *  {@link #sendTime}   发送时间
     *  {@link #status}     当前状态 发送 未发送 暂定
     *  {@link #type}       消息的类型 {@link WsCst.MsgType}
     *  {@link #text}       数据库存储的具体文案
     *  {@link #status}     {@link WsCst.MsgStatus}
     *  {@link #obj}        如果是对象的话 存储在这个字段里面 落地的时候会存到 text 里面
     *
     */
    @Id
    @MongoId()
    private Long id;
    private Long fromId;
    private Long toId;
    private LocalDateTime createTime = LocalDateTime.now();
    private LocalDateTime sendTime;
    private String status = WsCst.MsgStatus.NOT_SEND;
    private String type;
    private String text;

    private Map<String,Object> obj;

    //  心跳
    public static Message beat(long userId){
        Message msg = new Message();
        msg.type = WsCst.MsgType.BEAT;
        msg.setId(-1l);
        msg.setFromId(userId);
        msg.setToId(userId);
        return msg;
    }

    //  发送给具体用户
    public static Message sendTo(long userId,long toId,Object data){
        Message msg = new Message();
        msg.type = WsCst.MsgType.SEND_USER;
        msg.setId(-1l);
        msg.setFromId(userId);
        msg.setToId(toId);
        if(data instanceof String || data instanceof Number){
            msg.obj = new HashMap<>();
            msg.obj.put("value",data);
            return msg;
        }

        msg.obj = ((JSONObject) JSON.toJSON(data));

        return msg;
    }

    public <T> T jsonData(Class<? extends T> clz){
        return ((JSONObject) JSON.toJSON(obj)).toJavaObject(clz);
    }

    public String stringData(){
        return String.valueOf(obj.get("value"));
    }
}
